/*
 * TokenBucketProfiler.h
 *
 *  Created on: 2011-04-11
 *      Author: Jagger
 */

#ifndef TOKENBUCKETPROFILER_H_
#define TOKENBUCKETPROFILER_H_

#include "AbstractProfiler.h"

/**
 * Klasa implementujaca algorytm cieknacego wiadra.
 * Co sekunde do wiadra naplywa okreslona liczba tokenow. W wiadrze moze znajdowac
 * sie maksymalnie N tokenow. W momencie gdy do profilera trafia pakiet, jego
 * dlugosc porownywana jest z aktualna liczba tokenow w wiadrze. Jesli liczba
 * tokenow jest niemniejsza od dlugosci pakietu, to pakiet jest wysylany dalej,
 * a aktualna liczba tokenow zmniejszana jest o dlugosc pakietu.
 */
class TokenBucketProfiler : public AbstractProfiler
{
protected:
	/**
	 * Aktualna liczba tokenow w wiadrze.
	 */
	int32_t tokens;
	/**
	 * Maksymalna liczba tokenow jaka moze znalezc sie w wiadrze.
	 */
	int32_t tokensMax;
	/**
	 * Liczba tokenow jaka jest dodawana do wiadra co sekunde.
	 */
	int32_t tokenIncrement;
	/**
	 * Czas statniej inkrementacji tokenow w wiadrze.
	 */
	simtime_t lastTokenIncrement;
	/**
	 * Ostatni zakolejkowany pakiet.
	 */
	NetPacket* lastDelayedPacket;

	virtual void initialize();
	virtual bool acceptPacket(NetPacket* packet, simtime_t& delay);
};

#endif /* TOKENBUCKETPROFILER_H_ */
